home *** CD-ROM | disk | FTP | other *** search
/ Power Tools for Macintosh / Power Tools for Macintosh (SoftBit)(1992).iso / Stacks / *F-I / HyperCard Utilities / Videodisc⁄Drivers ƒ / PioneerLVP4200.p < prev    next >
Encoding:
Text File  |  1987-02-06  |  8.4 KB  |  331 lines  |  [TEXT/MPS ]

  1. {$R-}
  2. {$D+}
  3. (*
  4.     Pioneer LVP 4200 -- a WildCard user-defined command to drive a laser disc player.
  5.  
  6.     To compile and link this file using Macintosh Programmer's Workshop,
  7.  
  8.     pascal PioneerLVP4200.p
  9.     link -o WildCommands -sn Main=PioneerLVP4200 -sn STDIO=PioneerLVP4200 ∂
  10.          -sn INTENV=PioneerLVP4200 -rt WCMD=5 ∂
  11.          PioneerLVP4200.p.o {MPW}libraries:interface.o
  12.  
  13.     then use ResEdit to copy the resulting WCMD from WildCommands
  14.     and paste it into WildCard, the Home stack, or your own stack.
  15.     (WCMD=1 Panasonic, =2 Hitachi, =3 Phillips, =4 PioneerLDV6000,
  16.      =5 PioneerLVP4200)
  17. *)
  18.  
  19. UNIT DummyUnit;
  20.  
  21. INTERFACE
  22.  
  23.    USES MemTypes, QuickDraw, OsIntf;
  24.     
  25. IMPLEMENTATION
  26.  
  27. PROCEDURE Pioneer(commandPtr: Ptr);                                        FORWARD;
  28.  
  29.    PROCEDURE EntryPoint(arg: Ptr);
  30.    { entry point cannot have local procs, but forward routines can }
  31.    BEGIN
  32.      Pioneer(arg);
  33.    END;
  34.  
  35.    PROCEDURE Pioneer(commandPtr: Ptr);
  36.    VAR reverseFlag, offFlag, tillFlag: BOOLEAN;
  37.        message: Str255;
  38.        refNum: INTEGER;
  39.        err: INTEGER;
  40.             
  41.      PROCEDURE OpenSerial;
  42.      VAR handShake: SerShk;
  43.          baudRate: INTEGER;
  44.      BEGIN
  45.        baudRate := 4800;
  46.        { for now, use modem port so we don't mess with AppleTalk }
  47.        err := FSOpen('.AOUT',0,refNum);
  48.        IF err = 0 THEN 
  49.          BEGIN
  50.            WITH handShake DO
  51.              BEGIN
  52.                fXon := 1;
  53.                fCTS := 1;
  54.                xon  := CHR(17);
  55.                xoff := CHR(19);
  56.                errs := 0;
  57.                evts := 0;
  58.                fInx := 0;
  59.              END;
  60.            err := SerHShake(refNum,handShake);
  61.            IF err = 0 THEN 
  62.              err := Control(refNum,13,@baudRate);
  63.          END;
  64.      END;
  65.      
  66.      
  67.      PROCEDURE CloseSerial;
  68.      BEGIN
  69.        err := FSClose(refNum);
  70.      END;
  71.      
  72.      
  73.      PROCEDURE SendCommand(cmd: Str255);
  74.      VAR count: LongInt;
  75.      { all commands must have an extra char at end }
  76.      BEGIN
  77.        count := Length(cmd);
  78.        cmd[count] := CHAR(13);   { carriage return }
  79.        err := FSWrite(refNum, count, Pointer(Ord(@cmd)+1));
  80.      END;
  81.      
  82.      PROCEDURE SendDirect;
  83.      VAR charCnt, skip: LongInt;
  84.        { direct commands must have an extra char at the end }
  85.      BEGIN
  86.        charCnt := Length(message);
  87.        message[charCnt] := CHAR(13);   { carriage return }
  88.        skip := Length('PioneerLVP4200 direct') + 1;
  89.        err := FSWrite(refNum, charCnt, Pointer(Ord(@message)+skip));
  90.      END;
  91.  
  92.      FUNCTION Concat(str1, str2, str3: Str255): Str255;
  93.      VAR result: Str255;
  94.          resultLen: INTEGER;
  95.          charNum: INTEGER;
  96.      BEGIN
  97.        result := '';
  98.        resultLen := 0;
  99.        FOR charNum := 1 TO Length(str1) DO
  100.          BEGIN
  101.            resultLen := resultLen + 1;
  102.            result[resultLen] := str1[charNum];
  103.          END;
  104.        FOR charNum := 1 TO Length(str2) DO
  105.          BEGIN
  106.            resultLen := resultLen + 1;
  107.            result[resultLen] := str2[charNum];
  108.          END;
  109.        FOR charNum := 1 TO Length(str3) DO
  110.          BEGIN
  111.            resultLen := resultLen + 1;
  112.            result[resultLen] := str3[charNum];
  113.          END;
  114.       result[0] := CHR(resultLen);
  115.       Concat := result;
  116.      END;
  117.      
  118.      
  119.      PROCEDURE GetMessage;     
  120.      VAR charNum: INTEGER;
  121.          msgChar: CHAR;
  122.      BEGIN
  123.        { skip command name }
  124.        WHILE (commandPtr^ <> 0) AND (commandPtr^ <> 13) AND (CHR(commandPtr^) <> ' ') DO
  125.          commandPtr := Pointer(Ord(commandPtr)+1);
  126.          
  127.        { skip following white space }
  128.        WHILE CHR(commandPtr^) = ' ' DO 
  129.          commandPtr := Pointer(Ord(commandPtr)+1);
  130.          
  131.        { extract the rest into a Str255 }
  132.        charNum := 0;
  133.        WHILE (commandPtr^ <> 0) AND (charNum < 255) DO
  134.          BEGIN
  135.            msgChar := CHR(commandPtr^);
  136.            commandPtr := Pointer(Ord(commandPtr)+1);
  137.            charNum := charNum + 1;
  138.            IF (ORD(msgChar) >= ORD('A')) AND (ORD(msgChar) <= ORD('Z')) THEN
  139.              message[charNum] := CHR(ORD('a') + (ORD(msgChar) - ORD('A')))
  140.            ELSE message[charNum] := msgChar;
  141.          END;
  142.        message[0] := CHR(charNum);
  143.      END;
  144.      
  145.        
  146.      FUNCTION Contains(target: Str255): BOOLEAN;
  147.      VAR offset: INTEGER;     
  148.      
  149.        FUNCTION Match: BOOLEAN;
  150.        VAR index: INTEGER;
  151.        BEGIN
  152.          Match := TRUE;
  153.          FOR index := 1 TO Length(target) DO
  154.            IF offset + index > Length(message) THEN 
  155.              BEGIN
  156.                Match := FALSE;  { ran off the end }
  157.                EXIT(Match);
  158.              END
  159.            ELSE IF target[index] <> message[offset+index] THEN
  160.              BEGIN
  161.                Match := FALSE;  { hit a wrong char }
  162.                EXIT(Match);
  163.              END;
  164.        END;
  165.        
  166.      BEGIN
  167.        Contains := FALSE;
  168.        FOR offset := 0 TO Length(message) - 1 DO
  169.          IF Match THEN
  170.            BEGIN
  171.              Contains := TRUE;
  172.              EXIT(Contains);
  173.            END;
  174.      END;
  175.      
  176.      
  177.      FUNCTION GetDigit(digit: CHAR): Str255;
  178.      BEGIN
  179.        CASE digit OF
  180.          { doing a type conversion }
  181.          '0': GetDigit := '0';
  182.          '1': GetDigit := '1';
  183.          '2': GetDigit := '2';
  184.          '3': GetDigit := '3';
  185.          '4': GetDigit := '4';
  186.          '5': GetDigit := '5';
  187.          '6': GetDigit := '6';
  188.          '7': GetDigit := '7';
  189.          '8': GetDigit := '8';
  190.          '9': GetDigit := '9';
  191.        END;
  192.      END;
  193.   
  194.   
  195.      FUNCTION GetInteger: Str255;
  196.      { get an integer in Pioneer format }
  197.      VAR digitLoc, charVal: INTEGER;
  198.          intStr: Str255;       
  199.      BEGIN
  200.        intStr := '';
  201.        FOR digitLoc := 1 TO Length(message) DO
  202.          BEGIN
  203.            charVal := ORD(message[digitLoc]);
  204.            IF (charVal >= ORD('0')) AND (charVal <= ORD('9')) THEN
  205.              intStr := Concat(intStr, GetDigit(message[digitLoc]), '');
  206.          END;
  207.        GetInteger := intStr;
  208.      END;
  209.  
  210.    BEGIN
  211.      OpenSerial;
  212.      IF err <> 0 THEN 
  213.        BEGIN
  214.          SysBeep(1);
  215.          EXIT(Pioneer);
  216.        END;
  217.      
  218.      GetMessage;
  219.      
  220.      { set flags }
  221.      reverseFlag := Contains('rev');
  222.      offFlag := Contains('off');
  223.      tillFlag := Contains('till');
  224.      
  225.      IF Contains('stop') THEN SendCommand('ST^')
  226.      ELSE IF Contains('eject') THEN SendCommand('RJ OP^')
  227.      ELSE IF Contains('search') THEN SendCommand(Concat(GetInteger, 'SE', '^'))
  228.      ELSE IF Contains('step') THEN
  229.        BEGIN
  230.          IF reverseFlag THEN SendCommand('SR^')
  231.          ELSE SendCommand('SF^')
  232.        END
  233.      ELSE IF Contains('play') THEN
  234.        BEGIN
  235.          IF tillFlag THEN SendCommand(Concat('FR ', GetInteger, ' PL^'))
  236.          ELSE IF reverseFlag THEN SendCommand('60 SP MR^')  { speed normal, multi-reverse }
  237.          ELSE SendCommand('PL^')
  238.        END
  239.      ELSE IF Contains('slow') THEN
  240.        BEGIN
  241.          IF reverseFlag THEN SendCommand('30 SP MR^')
  242.          ELSE SendCommand('30 SP MF^')
  243.        END
  244.      ELSE IF Contains('slow') THEN
  245.        BEGIN
  246.          IF tillFlag THEN
  247.            BEGIN
  248.              IF reverseFlag THEN SendCommand(Concat('30 SP FR ', GetInteger, ' MR^'))
  249.              ELSE SendCommand(Concat('30 SP FR ', GetInteger, ' MF^'));
  250.            END
  251.          ELSE IF reverseFlag THEN SendCommand('30 SP MR^')
  252.            ELSE SendCommand('30 SP MF^')
  253.        END
  254.      ELSE IF Contains('slower') THEN
  255.        BEGIN
  256.          IF tillFlag THEN
  257.            BEGIN
  258.              IF reverseFlag THEN SendCommand(Concat('15 SP FR ', GetInteger, ' MR^'))
  259.              ELSE SendCommand(Concat('15 SP FR ', GetInteger, ' MF^'));
  260.            END
  261.          ELSE IF reverseFlag THEN SendCommand('15 SP MR^')
  262.            ELSE SendCommand('15 SP MF^')
  263.        END
  264.      ELSE IF Contains('slowest') THEN
  265.        BEGIN
  266.          IF tillFlag THEN
  267.            BEGIN
  268.              IF reverseFlag THEN SendCommand(Concat('10 SP FR ', GetInteger, ' MR^'))
  269.              ELSE SendCommand(Concat('10 SP FR ', GetInteger, ' MF^'));
  270.            END
  271.          ELSE IF reverseFlag THEN SendCommand('10 SP MR^')
  272.            ELSE SendCommand('10 SP MF^')
  273.        END
  274.      ELSE IF Contains('fast') THEN
  275.        BEGIN
  276.          IF tillFlag THEN
  277.            BEGIN
  278.              IF reverseFlag THEN SendCommand(Concat('180 SP FR ', GetInteger, ' MR^'))
  279.              ELSE SendCommand(Concat('180 SP FR ', GetInteger, ' MF^'));
  280.            END
  281.          ELSE IF reverseFlag THEN SendCommand('180 SP MR^')
  282.            ELSE SendCommand('180 SP MF^')
  283.        END
  284.      ELSE IF Contains('faster') THEN
  285.        BEGIN
  286.          IF tillFlag THEN
  287.            BEGIN
  288.              IF reverseFlag THEN SendCommand(Concat('240 SP FR ', GetInteger, ' MR^'))
  289.              ELSE SendCommand(Concat('240 SP FR ', GetInteger, ' MF^'));
  290.            END
  291.          ELSE IF reverseFlag THEN SendCommand('240 SP MR^')
  292.            ELSE SendCommand('240 SP MF^')
  293.        END
  294.      ELSE IF Contains('scan') THEN
  295.        BEGIN
  296.          IF reverseFlag THEN SendCommand('NR^')
  297.          ELSE SendCommand('NF^')
  298.        END
  299.      ELSE IF Contains('picture') THEN
  300.        BEGIN
  301.          IF offFlag THEN SendCommand('0VD^')
  302.          ELSE SendCommand('1VD^')
  303.        END
  304.      ELSE IF Contains('frame') THEN
  305.        BEGIN
  306.          IF offFlag THEN SendCommand('0DS^')
  307.          ELSE SendCommand('1DS^')
  308.        END
  309.      ELSE IF Contains('sound') THEN 
  310.        BEGIN
  311.          IF Contains('1') THEN
  312.            IF offFlag THEN SendCommand('0AD^')
  313.            ELSE SendCommand('1AD^')
  314.          ELSE IF Contains('2') THEN
  315.            IF offFlag THEN SendCommand('0AD^')
  316.            ELSE SendCommand('2AD^')
  317.          ELSE IF offFlag THEN SendCommand('0AD^')
  318.            ELSE SendCommand('3AD^')  { stereo on }
  319.        END
  320.      ELSE IF Contains('init') THEN SendCommand('SA^')
  321.      ELSE IF Contains('direct') THEN  SendDirect
  322.          { direct commands must have an extra char at the end }
  323.      ELSE  SysBeep(1); { unknown command }
  324.      CloseSerial;
  325.    END;   
  326.  
  327. END.
  328.  
  329.  
  330.  
  331.